package com.ruoyi.system.service;

import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.system.domain.ApproveCarbonCopy;
import com.ruoyi.system.domain.FormGroups;
import com.ruoyi.system.domain.ProcessTemplates;
import com.ruoyi.system.domain.dto.HandleDataDTO;
import com.ruoyi.system.domain.dto.StartProcessInstanceDTO;
import com.ruoyi.system.domain.vo.HandleDataVO;
import com.ruoyi.system.domain.vo.HistoryProcessInstanceVO;
import com.ruoyi.system.domain.vo.TaskDetailVO;
import com.ruoyi.system.domain.vo.TaskVO;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;


import java.util.List;
import java.util.Map;

public interface WorkspaceProcessService {

    /**
     * 查询用户可以发起的流程模板
     */
    public List<FormGroups> selectFormGroupsListByUserId(SysUser sysUser);


    /**
     * 通过模板id查看流程信息 会附带流程定义id
     */
    public ProcessTemplates selectProcessTemplatesByTemplateId(String templateId);


    /**
     * 通过流程定义id启动流程
     */
    public AjaxResult startProcess(StartProcessInstanceDTO startProcessInstanceDTO);


    /**
     * 查看抄送
     */
    public List<ApproveCarbonCopy>  selectCCList(ApproveCarbonCopy approveCarbonCopy);

    /**
     * 查看我发起的流程
     * @return
     */
    public List<HistoryProcessInstanceVO> applyList(List<HistoricProcessInstance> historicProcessInstances);

    /**
     * 查看我的待办
     * @return
     */
    public List<TaskVO> toDoList(List<Task> tasks);

    /**
     * 查看我的已办
     * @return
     */
    public List<TaskVO> doneList(List<HistoricTaskInstance> tasks);

    /**
     * 同意按钮
     * @return
     */
    public AjaxResult agree(HandleDataDTO handleDataDTO);

    /**
     * 委派按钮
     * @return
     */
    public AjaxResult delegateTask(HandleDataDTO handleDataDTO);


    /**
     * 委派人完成的按钮
     * @return
     */
    public AjaxResult resolveTask(HandleDataDTO handleDataDTO);


    /**
     * 拒绝的按钮
     * @return
     */
    public AjaxResult refuse(HandleDataDTO handleDataDTO);


    /**
     * 撤销的按钮
     * @return
     */
    public AjaxResult revoke(HandleDataDTO handleDataDTO);

    /**
     * 转办的按钮
     * @return
     */
    public AjaxResult assignee(HandleDataDTO handleDataDTO);


    /**
     * 查询可退回的节点(这个是给 下面 rollback接口作为入参用的
     * @return
     */
    public Map<String,String> rollbackNodes(HandleDataDTO handleDataDTO);



    /**
     * 退回按钮
     * @return
     */
    public AjaxResult rollback(HandleDataDTO handleDataDTO);


    /**
     * 加签按钮
     * @return
     */
    public AjaxResult addMulti(HandleDataDTO handleDataDTO);

    /**
     * 通过流程实例查看审批记录
     * @return
     */
    public List<TaskDetailVO> record (String processInstanceId);


    /**
     * 查看所有的流程
     * @return
     */
    public List<HistoryProcessInstanceVO> submitedTaskList (List<HistoricProcessInstance> historicProcessInstances);


    /**
     * 通过流程实例id查看详情
     * @return
     */
    public HandleDataVO instanceInfo(HandleDataDTO handleDataDTO);


    /**
     * 删除审批
     * @return
     */
    public AjaxResult deleteProcessInstance(String processInstanceId);
}
